package educar.models;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import educar.db.JPA;

public class Facultad{
	private String nro_facultad;
	private String cod_facultad;
	private String descripcion;
	private static JPA jpa= new JPA();
	
	/**
	 * metodo constructor de la clase, crea una nueva Facultad
	 * @param newCodigo "String que contiene el codigo de cada facultad" 
	 * @param newDescripcion "String que contiene la descripcion de cada facultad"
	 */	
	public Facultad (String nro_fac,String cod_facultad, String descripcion){
		setNroFac(nro_fac);
		setCod_facultad(cod_facultad);
		setDescripcion(descripcion);
	}
	
	
	/**
	 * permite establecer el nro de una facultad
	 * @param newCodigo "String que cotiene el nro de cada facultad"
	 */
	public void setNroFac(String newNro){
		nro_facultad= newNro;
	}
	
	/**
	 * retorna el nro de la facultad
	 * @return String con el nro
	 */
	public String getNroFac(){
		return nro_facultad;
	}
	
	
	/**
	 * permite establecer el codigo de una facultad
	 * @param newCodigo "String que cotiene el codigo de cada facultad"
	 */
	public void setCod_facultad(String newCod_facultad){
		cod_facultad= newCod_facultad;
	}
	
	/**
	 * retorna el codigo de la facultad
	 * @return String con el codigo
	 */
	public String getCod_facultad(){
		return cod_facultad;
	}
	
	/**
	 * permite establecer la descripcion de la facultad
	 * @param newDescripcion "String que cotiene la descripcion de la facultad"
	 */
	public void setDescripcion (String newDescripcion){
		descripcion= newDescripcion;
	}
	
	/**
	 * retorna la descripcion de la facultad
	 * @return String con la descripcion
	 */
	public String getDescripcion(){
		return descripcion;
	}
	
	/**
	 * Permite guardar una facultad en la base de datos
	 * @return true o false dependiendo existo o fracaso guardando
	 */
	public boolean save() {
		try {
			Facultad.getFacultadByCodigo(getCod_facultad());
			return false;
		} catch (facultadNotFound e1) {
			}
			String[] columns = { "cod_facultad", "descripcion"};
			PreparedStatement stm = jpa.newRecord("facultad", columns);
			try {
				stm.setString(1, cod_facultad);
				stm.setString(2, descripcion);
	
			} catch (SQLException e) {
				e.printStackTrace();
				return false;
			}
			jpa.create(stm);
			return true;
		}

	/**
	 * Permite eliminar una facultad en la base de datos
	 */
	public void destroy() {
		try {
			jpa.destroy("facultad", "cod_facultad", getCod_facultad());
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * dado el codigo te retorna una facultad
	 * @param codigo "codigo de la facultad"
	 * @return "objeto facultad con ese codigo"
	 * @throws facultadNotFound "por si no existe una con ese codigo"
	 */
	public static Facultad getFacultadByCodigo(String cod_facultad) throws facultadNotFound {
		ResultSet rs = null;
		Facultad t = null;
		rs = jpa.getByField("facultad", "cod_facultad", cod_facultad);
		try {
			if (rs.next()) {
				t = new Facultad(rs.getString(1), rs.getString(2),rs.getString(3));
			} 
			else {
				throw new facultadNotFound();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return t;
	}
	
	
	/**
	 * permite actualizar en la base de datos una facultad
	 * @return si pudo realizar la operacion
	 */
	public boolean update() {
		try {
			String[] datos = {getCod_facultad(),getDescripcion()};
			String[] columns = { "cod_facultad","descripcion" };
			jpa.update("facultad", columns, datos, "nro_facultad", getNroFac());
			return true;
		} catch(Exception ex) {
			return false;
		}
	}

	/**
	 * Obtiene la tabla Facultad
	 * @return Tabla facultad de la DB
	 */
	public static Object[][] getFacultadTalbe() {
		Object[][] facultadTable = jpa.ResultSetToArray(jpa.showAll("facultad"));
		return facultadTable;
	}
	
	
	/**
	 * Obtiene la lista de facultades disponibles
	 * @return Array de Facultad
	 */
	public static Facultad[] getFacultadList() {
		String[][] result = jpa.ResultSetToStringArray(jpa.showProyection("facultad", "cod_facultad"));
		Facultad[] facultadList = new Facultad[result.length];
		for (int i=0;i<result.length;i++) {
			try {
				facultadList[i] = Facultad.getFacultadByCodigo(result[i][0]);
			} catch (facultadNotFound e1) {
				e1.printStackTrace();
			}
		}
		return facultadList;
	}
	
	/**
	 * Compara objetos del tipo facultad	
	 */
	public boolean equals(Object arg0) {
		if (arg0==null) {
			return false;
		}
		if (this.getCod_facultad().equals(((Facultad) arg0).getCod_facultad())) {
			return true;
		}
		return false;		
	}
	
	
	/**
	 * Redefinicion del metodo convertir a cadena
	 */
	public String toString() {
		return this.getCod_facultad()+" -- "+this.getDescripcion();
	}
	
	
	/**
	 * Metodo utilizado en la busqueda
	 * @param arg0 string a buscar
	 * @return boolean si es parecido o no
	 */
	public boolean comparar(String arg0) {
		String busq = arg0.toLowerCase();
		String cod = this.getCod_facultad().toLowerCase();
		String nam = this.getDescripcion().toLowerCase();
		return (busq.equals(cod) || busq.equals(nam));
	}
	
}